AWS IoT Greengrass Core には ZIP ファイルの展開機構が組み込まれている話

AWS IoT Greengrass Core には ZIP ファイルの展開機構が組み込まれている話

Clock Icon2025.01.21

実は AWS IoT Greengrass の コアパッケージである Greengrass Core(Greengrass Necleus)には、ZIP の解凍機能が独自に組み込まれています。

本記事では、その詳細と動作確認までを紹介したいと思います。

背景

これまで私は、ZIP でビルドされたアーティファクトをデバイスにデプロイする時、ZIP の展開は デプロイ対象の環境に依存するものと思っていました。

というのも Linux 環境の場合、多くのケースで zip コマンドがシステムにインストールされているので、Greengrass で ZIP のアーティファクトをデプロイするときも、Linux(デプロイ対象のマシン)環境にある ZIP コマンドを利用して展開しているものと思っていました。

しかし、Windows 環境ではコマンドプロンプトや PowerShell では、デフォルトで ZIP コマンドは利用できません。
代替案として、Windows11 では tar コマンドで ZIP ファイルの展開ができるようで、システム環境変数のパスに tar.exe が存在します。そのため ggc_user でも ZIP の展開自体は可能です。また、PowerShell の Expand-Archive コマンドも利用できるので、OS 標準の機能で ZIP を展開すること自体はできそうです。
(できそうですが、Greengrass のユースケースでどう使うのかについては工夫が必要に思います。)

https://mjeld.com/windows-11-zip-tar/

一方で Greengrass のドキュメントには、次のような記載があります。

コンポーネントがインストールされると、AWS IoT Greengrass はコンポーネントのアーカイブアーティファクトをこの変数が公開するフォルダに解凍します。

02-decompress-ggc.png

https://docs.aws.amazon.com/greengrass/v2/developerguide/component-recipe-reference.html#component-recipe-artifacts-decompressed-path

この記述だけでは、アーカイブの解凍をどういう仕組みで行うのか判断できません。
しかし、Docker コンテナとしてコンポーネントを動かす場合は、「デバイスに Docker のインストールが必要」と明記されています。

https://docs.aws.amazon.com/ja_jp/greengrass/v2/developerguide/run-docker-container.html

もしデバイスに ZIP ファイルを展開する何らかの機構が別途必要なら、Docker のようにドキュメントにその旨の説明がありそうです。
しかし、ドキュメントにはその説明がなく「Greengrass はアーカイブを解凍する」とだけ記載されているので、Greengrass 側に 「ZIP を解凍する仕組みが組み込まれている」 と考えられます。

ソースコード

Greengrass Nucleus のソースコードは GitHub で公開されているので、上記のような仮定を元に実際のコードを確認してみると Unarchiver.java というコードが見つかりました。
下記で Unarchiver というクラスが定義されています。

https://github.com/aws-greengrass/aws-greengrass-nucleus/blob/main/src/main/java/com/aws/greengrass/componentmanager/Unarchiver.java

昨年末にリリースされた Greengrass Lite においても、同様の機能が組み込まれているようです。

https://github.com/aws-greengrass/aws-greengrass-lite/blob/main/modules/ggl-zip/include/ggl/zip.h

検証してみる

以前の記事では、アーティファクトをビルドする際に ZIP にせずにカスタムビルドで bat ファイルをそのままアーティファクトにしていました。
今回は、カスタムビルドではなく ZIP 化したアーティファクトで試してみたいと思います。

https://dev.classmethod.jp/articles/greengrass-windows-custom-component-for-bat/

ZIP でビルドした Greengrass コンポーネントの作成

以前の記事のように GDK CLI でコンポーネントの作成を行います。対象のデバイスにはすでに Greeengrass Core がインストール済みとします。
まだインストールされていない場合は、前回の内容などを参考に準備してください。

まず次の内容で レシピ を作成します。
コンポーネント名は com.example.windowstest02 としました。
前回の記事との違いの特徴は、アーティファクトの URI に ZIP ファイルを指定し、展開方法の指定を ZIP としている点です。(Unarchive: ZIP

また、デプロイ後にコンポーネントを起動するパスも {artifacts:decompressedPath} が含まれており解凍後のパスを指定しています。

recipe.yaml
---
RecipeFormatVersion: "2020-01-25"
ComponentName: "com.example.windowstest02"
ComponentVersion: "{COMPONENT_VERSION}"
ComponentDescription: "This is sample component for Windows.(zip archive Ver.)"
ComponentPublisher: "{COMPONENT_AUTHOR}"
ComponentConfiguration:
  DefaultConfiguration:
    Message: "World"
Manifests:
  - Platform:
      os: windows
    Artifacts:
      - Uri: "s3://BUCKET_NAME/COMPONENT_NAME/COMPONENT_VERSION/windowstest02.zip"
        Unarchive: ZIP
    Lifecycle:
      run: "{artifacts:decompressedPath}/windowstest02/windowstest02.bat"

参考ドキュメントは下記になります。

https://docs.aws.amazon.com/greengrass/v2/developerguide/component-recipe-reference.html#recipe-validation

gdk-config.json もビルド方法は zip を指定する形にします。

gdk-config.json
{
  "component": {
    "com.example.windowstest02": {
      "author": "CM-ICHIDA",
      "version": "NEXT_PATCH",
      "build": {
        "build_system": "zip",
        "options": {
          "zip_name": "windowstest02"
        }
      },
      "publish": {
        "bucket": "greengrass-windows-test-20250110",
        "region": "ap-northeast-1"
      }
    }
  },
  "gdk_version": "1.6.1"
}

コンポーネントで動かす bat ファイルの内容は前回の内容のままです。
前回の記事のコンポーネントがデプロイ済みなので、区別するために出力ファイルを hardware2.txt に変更しています。

windowtest02.bat
@ECHO OFF
 chcp 437
>hardware2.txt (
:: This batch file will discover the windows version we are using and store to a text file
TITLE My System Info 2
ECHO ==========================
ECHO WINDOWS INFO
ECHO ============================
systeminfo | findstr /c:"OS Name"
systeminfo | findstr /c:"OS Version"
systeminfo | findstr /c:"System Type"
)

コンポーネントのビルドとデプロイ

カスタムビルドでは無いので準備はこれだけです。
ビルド & パブリッシュします。

gdk component build
gdk component publish

com.example.windowstest02 というコンポーネントができました。

03-component-windowstest02.png

デバイスにデプロイします。

04-deploy-component.png

動作確認

Windows デバイス側を確認します。
AWS IoT Greengrass のワークフォルダ(C:\greengrass\v2\work\com.example.windowstest02)に移動して、hardware2.txt ができていることを確認できました。

05-deploy-result.png

デプロイ済みコンポーネントのフォルダ構成の確認

ZIP 化したものと、そうでないもの( bat ファイルをそのままデプロイしたもの)で、Windows 側のフォルダ構成を少し確認してみましょう。
( bat ファイルをそのままデプロイしたものは、前回の記事でデプロイしたコンポーネントです。)

C:\greengrass\v2\packages\artifacts のフォルダは、S3 からダウンロードしたアーティファクトが配置されます。
com.example.windowstest01 は カスタムビルドで指定した通り bat ファイルが置かれているのに対して、com.example.windowstest02 は ZIP ファイルがダウンロードされています。

C:\greengrass\v2\packages\artifacts>tree /f
フォルダー パスの一覧:  ボリューム Windows
ボリューム シリアル番号は C47A-3FCF です
C:.
├─aws.greengrass.Cli
│  └─2.14.0
│          aws.greengrass.cli.client.zip
│          aws.greengrass.Cli.jar
│
├─aws.greengrass.Nucleus
│  └─2.14.0
│          aws.greengrass.nucleus.zip
│
├─com.example.windowstest01
│  └─1.0.0
│          windowstest01.bat
│
└─com.example.windowstest02
    └─1.0.0
            windowstest02.zip

また、C:\greengrass\v2\packages\artifacts-unarchived フォルダも確認してみます。このフォルダは解凍したアーティファクトが配置されます。
ZIP 化した com.example.windowstest02 フォルダには各種ファイルが展開されているの対して、com.example.windowstest01 フォルダには何もありません。アーティファクトを ZIP 化していないためですね。

C:\greengrass\v2\packages\artifacts-unarchived>tree /f
フォルダー パスの一覧:  ボリューム Windows
ボリューム シリアル番号は C47A-3FCF です
C:.
├─aws.greengrass.Cli
│  └─2.14.0
│      └─aws.greengrass.cli.client
(中略)
│
├─aws.greengrass.Nucleus
│  └─2.14.0
│      └─aws.greengrass.nucleus
(中略)
├─com.example.windowstest01
│  └─1.0.0
└─com.example.windowstest02
    └─1.0.1
        └─windowstest02
            │  .gitignore
            │  README.md
            │  windowstest02.bat
            │
            ├─src
            │      greeter.py
            │
            └─tests
                    test_greeter.py

最後に

Greengrass は Linux や Windows などマルチプラットフォームをサポートしています。そのため ZIP の展開機能など、コンポーネントのデプロイ時にデバイス環境に依存しない仕組みが備わっています。

デバイス環境に関係なく一貫したコンポーネントのデプロイ手法が取れるのは Greengrass の魅力の一つかと思います。

IoT 導入支援 / 相談会の紹介

クラスメソッドでは、AWS を中心とした IoT 導入においてエッジからクラウドまでトータルでサポートしています。

このようなお困りごとがあれば、お気軽にお問い合わせください。

  • ローカルでデータ収集と可視化はできたが、クラウドで可視化する適切な構成が分からない
  • 集めたデータを使って故障予知などに使いたい
  • 工場設備からデータ収集してクラウドに送る方法が分からない
  • スマートファクトリー化を検討しているが何から着手していいか分からない
  • デバイスで動くアプリケーションの開発を AWS で効率化したい
  • エッジデバイスのセキュリティが心配だ
  • その他、お困り事があれば何でもご相談ください

https://classmethod.jp/seminar/aws-consultation/

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.